package com.源码分析.以编程方式创建流;

import org.junit.Ignore;
import org.junit.Test;

import reactor.core.publisher.Flux;
import reactor.util.function.Tuples;

public class GenerateDemo {

	@Test
	@Ignore
	public void test() {
		Flux<Object> source = Flux.generate(() -> 0, (state, sink) -> {
			sink.next("3 x " + state + " = " + 3 * state);
			if (state == 10)
				sink.complete();
			return state + 1;
		});
		source.subscribe(x -> {
			System.out.println(x);
		});
	}

	// 基于生成器的内部处理状态创建复杂序列。它需要一个初始值和一个函数，该函数根据前一个内部状态计算下一个状态，并将onNext信号发送给下游订阅者，例如创建一个斐波那契数列
	// 在下一个值生成之前，每个新值都被同步传播给订阅者，当生成不同的复杂响应式序列，而该序列需要保持发射之间的中间状态时，该方法非常有用
	@Test
	public void test2() {
		Flux.generate(
				() -> Tuples.of(0L, 1L),
				(state, sink) -> {
					sink.next(state.getT2());
					long newValue = state.getT1() + state.getT2();
					return Tuples.of(state.getT2(), newValue);
				}
		)
		.take(7)
		.subscribe(System.out::println);
	}

}
